auto and typeof
===============


.. index::
    auto
    typeof

Когда мы определяли переменную типа File в предыдущей главе, мы повторили имя типа
в левой и правой части выражения.

.. code-block:: d

    File file = File("student_records", "w");

Это кажется излишним. Также было бы громоздко и особенно подвержено ошибкам, если
бы имя типа было длиннее:

.. code-block:: d

    VeryLongTypeName var = VeryLongTypeName(/* ... */);

К счастью, имя типа в левой части необязательно, поскольку
компилятор может вывести тип левой части из выражения в
правой части. Чтобы компилятор мог вывести тип, можно использовать ключевое слово auto:

.. code-block:: d

    auto var = VeryLongTypeName(/* ... */);

auto можно использовать с любым типом, даже если тип не указан с правой
стороны:

.. code-block:: d

    auto duration = 42;
    auto distance = 1.2;
    auto greeting = "Hello";
    auto vehicle = BeautifulBicycle("blue");

Хотя "auto" является аббревиатурой от automatic, оно происходит не от автоматического
определения типа. Оно происходит от класса автоматического хранения, который представляет собой концепцию о времени
жизни переменных. auto используется, когда никакой другой спецификатор не подходит.
Например, в следующем определении не используется auto :

.. code-block:: d

    immutable i = 42;

Компилятор выводит тип i как immutable int выше. (Мы увидим
immutable в следующей главе.)

typeof
------


type of предоставляет тип выражения (включая отдельные переменные, объекты,
литералы и т.д.) без фактического вычисления этого выражения.
Ниже приведен пример того, как typeof можно использовать для указания типа
без его явного указания:

.. code-block:: d

    int value = 100; // already defined as 'int'
    typeof(value) value2; // means "type of value"
    typeof(100) value3; // means "type of literal 100"

The last two variable definitions above are equivalent to the following:

Два последних определения эквивалентны сдедющим строкам

.. code-block:: c++

    int value2;
    int value3;

Очевидно, что typeof не нужен в ситуациях, подобных описанным выше, когда фактические
типы известны. Вместо этого вы обычно используете его в более сложных сценариях,
где вы хотите, чтобы тип ваших переменных соответствовал какому-либо другому фрагменту
кода, тип которого может варьироваться. Это ключевое слово особенно полезно в шаблонах (стр.
399) и миксинах (стр. 560), оба из которых будут рассмотрены в последующих главах.


Упражнение
-----------

Как мы видели выше, типом литералов типа 100 является int (в отличие от short ,
long или любого другого типа). Напишите программу для определения типа
литералов с плавающей запятой, таких как 1.2. тип и .stringof были бы полезны в этой программе.
Решение :ref:`для главы auto and typeof<auto and typeof>`.
